﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Caixa.Model;
using Caixa.DB;
using System.Data.Common;
using System.Collections;

namespace Caixa.DAO
{
	public static class BancoDAO
	{
		#region " Methods "

		#region " Get Methods "

		public static Banco GetByID(int id)
		{
			Banco b = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}, {4}
					FROM {0}
					WHERE
						{1} = :{1}
				",
					Banco.Fields.TABELA,
					Banco.Fields.ID,
					Banco.Fields.NUMERO,
					Banco.Fields.NOME,
					Banco.Fields.PROPRIO
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Banco.Fields.ID, id));

				// Executa a query no banco de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do banco de dados em objeto
				b = DAHelper.ToModel<Banco>(data);
			}

			return b;
		}

		public static Banco GetMySelf()
		{
			Banco b = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}
					FROM {0}
					WHERE
						{2} = :{2}
				",
					Banco.Fields.TABELA,
					Banco.Fields.ID,
					Banco.Fields.PROPRIO
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Banco.Fields.PROPRIO, true));

				// Executa a query no banco de dados
				int bancoID;
				int.TryParse(string.Format("{0}", db.SelectSqlSc(SQL, parms.ToArray())), out bancoID);

				b = GetByID(bancoID);
			}

			return b;
		}

		public static Banco GetByNumero(int numeroBanco)
		{
			Banco b = null;

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}
					FROM {0}
					WHERE
						{2} = :{2}
				",
					Banco.Fields.TABELA,
					Banco.Fields.ID,
					Banco.Fields.NUMERO
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Banco.Fields.NUMERO, numeroBanco));

				// Executa a query no banco de dados
				int bancoID;
				int.TryParse(string.Format("{0}", db.SelectSqlSc(SQL, parms.ToArray())), out bancoID);

				b = GetByID(bancoID);
			}

			return b;
		}

		#endregion

		#region " DDL Methods "

		public static int Insert(Banco b)
		{
			int newID = 0;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Banco.Fields.NUMERO, b.Numero));
				parms.Add(db.GetParameter(Banco.Fields.NOME, b.Nome));

				// Executa a query no banco de dados e retorna o ID do novo registro
				newID = db.InsertSql(Banco.Fields.TABELA, parms.ToArray());
			}

			return newID;
		}

		public static bool Update(Banco b)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Banco.Fields.NUMERO, b.Numero));
				parms.Add(db.GetParameter(Banco.Fields.NOME, b.Nome));

				// Define a cláusula where do Update
				string sWhere = string.Format("{0} = {1}", Banco.Fields.ID, b.ID);

				// Executa a query no banco de dados e retorna se foi atualizado com sucesso
				success = db.UpdateSql(Banco.Fields.TABELA, parms.ToArray(), sWhere);
			}

			return success;
		}

		public static bool Delete(Banco b)
		{
			bool success = false;

			using (DAHelper db = new DAHelper())
			{
				// Define a cláusula where do Delete
				string sWhere = string.Format("{0} = {1}", Banco.Fields.ID, b.ID);

				// Executa a query no banco de dados e retorna se o registro foi excluido com sucesso
				success = db.DeleteSql(Banco.Fields.TABELA, sWhere);
			}

			return success;
		}

		#endregion

		#endregion
	}
}
